package Logic;


import Model.Resultados;
import java.util.ArrayList;
import java.util.List;

import Model.ResultadosUC;
import Model.Temperaturas;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


/**
 *
 * @author Jesus
 */
public class AlgoritmoSingleSine3 {
    private double tcmin;
    private double tcmax;
    
    public AlgoritmoSingleSine3(){
    }
    
    public AlgoritmoSingleSine3(double tcmin, double tcmax) {
        this.tcmin = tcmin;
        this.tcmax = tcmax;
    }

   public Resultados enviarUC(List<Temperaturas> listT){
//        List<ResultadosUC> listRUC = new ArrayList<ResultadosUC>();
        Resultados r=new Resultados();
        double ucAcumuladas = 0;
        for(Temperaturas temp:listT){
//            temp=listTs;
            double uc=senoSimple(temp.getTemperaturaMin(),temp.getTemperaturaMax());
            ucAcumuladas=uc+ucAcumuladas;
        }
        r.setUca(ucAcumuladas);
        return r;
    }
   
      public List<ResultadosUC> enviarUCAutodiagnostico(List<Temperaturas> listT, String modelo){
       double ucaP;
          if(modelo.equals("mosquita"))
           ucaP=302;
          else
              ucaP=195;
        List<ResultadosUC> listRUC = new ArrayList<ResultadosUC>();
        ResultadosUC rUC;
        double ucAcumuladas = 0;
        for(Temperaturas temp:listT){
//            temp=listTs;
            rUC=new ResultadosUC();
            rUC.setTmin(temp.getTemperaturaMin());
            rUC.setTmax(temp.getTemperaturaMax());
            double uc=senoSimple(temp.getTemperaturaMin(),temp.getTemperaturaMax());
            ucAcumuladas=uc+ucAcumuladas;
            if(ucAcumuladas>=ucaP)
                break;
            rUC.setUc(uc);
            rUC.setUcA(ucAcumuladas);
            listRUC.add(rUC);
        }
        return listRUC;
    }
   
   

    public double senoSimple(double tmin, double tmax) {
        double tMedia=(tmin + tmax) / 2;
        double const1 =1 / Math.PI;
        double const2 =Math.PI / 2;
        double alfa = (tmax - tmin) / 2;
        double gradoDia=0.0;
      

        if (tmax >= tcmax) {
            if (tmin > tcmax) {
                gradoDia = tcmax - tcmin;//caso 1
            } else {
                if (tmin >= tcmin) {
                    double teta2=Math.asin((tcmax - tMedia)/ alfa);
                    double coste2 =Math.cos(teta2);
                    gradoDia =  const1 * (((tMedia - tcmin) * (teta2 + const2)) + ((tcmax - tcmin) * (const2 - teta2))-(alfa*coste2));//caso 5
                } else {
                    double teta1 = Math.asin((tcmin - tMedia) / alfa);
                    double coste1 = Math.cos(teta1);
                    double teta2 = Math.asin((tcmax - tMedia) / alfa);
                    double coste2 = Math.cos(teta2);
                    gradoDia = const1 * (((tMedia - tcmin) * (teta2 - teta1)) + (alfa * (coste1 - coste2)) + ((tcmax - tcmin) * (const2 - teta2)));//caso6
                   
                }
            }
        } else {
            if (tmax <= tcmin) {
                gradoDia = 0;//caso 2
                
            } else {
                if (tmin >= tcmin) {
                    gradoDia = tMedia - tcmin;
                } else {
                    double teta1 = Math.asin((tcmin - tMedia) / alfa);
                    double coste1 = Math.cos(teta1);
                    gradoDia = const1 * (((tMedia - tcmin) * (const2 - teta1)) + (alfa * coste1));//caso 4
                  
                }
            }
        }
        return gradoDia;
    }
    
}
